package com.gov.ec.rsv.igm;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import org.primefaces.event.SelectEvent;

import com.gov.ec.rsv.interfaces.ICrudDao;
import com.gov.ec.rsv.modelo.Auditoria;
import com.gov.ec.rsv.modelo.Cabreservacion;
import com.gov.ec.rsv.modelo.Cliente;
import com.gov.ec.rsv.modelo.Detreservacion;
import com.gov.ec.rsv.modelo.Instalacion;
import com.gov.ec.rsv.modelo.Institucion;
import com.gov.ec.rsv.util.FacesUtil;
import com.gov.ec.rsv.util.PrimeFaceUtil;

public class ReservacionesBean extends FacesUtil {

	// Objetos Permisos
	// private Boolean perEditar;
	// private Boolean perGuardar;
	// private Boolean perEliminar;

	/** La variable Cliente. */
	private Cabreservacion cabRsv;
	private List<Cabreservacion> listaCabRsv;
	private Auditoria auditoriaCab;
	private String idInst;
	private String idCli;
	// private String idCli;
	private Institucion institucion;
	private List<Institucion> listaInstitucion;
	private List<Cliente> listaCliente;

	private Detreservacion detRsv;
	private List<Detreservacion> listaDetRsv;
	private Auditoria auditoriaDet;

	@EJB(name = "adminCrud/local")
	private ICrudDao adminCrud;

	public ReservacionesBean() throws NamingException {
		this.cabRsv = new Cabreservacion();
		this.listaCabRsv = new ArrayList<Cabreservacion>();
		this.detRsv = new Detreservacion();
		this.listaDetRsv = new ArrayList<Detreservacion>();
		this.listaInstitucion = new ArrayList<Institucion>();
		this.listaCliente = new ArrayList<Cliente>();

		InitialContext ic = new InitialContext();
		adminCrud = (ICrudDao) ic.lookup("RSVCCIGM/adminCrud/local");
	}

	/**
	 * Permite guardar o actulizar un objeto instalacion
	 * 
	 * @throws Exception
	 */
	public void guardarCabecera() throws Exception {
		if (cabRsv.getIdCabReservacion() != 0) {
			adminCrud.actualizar(cabRsv);
		} else {
			adminCrud.insertar(cabRsv);
		}
		resetearValores();
		super.addSuccessMessage(super.getRecursoGeneral()
				.getString("msgEditar") + " " + this.cabRsv.getDescrEvento());
		this.cabRsv = new Cabreservacion();
	}

	private void resetearValores() {
		setCabRsv(new Cabreservacion());
	}

	/**
	 * Permite eliminar un objeto Institucion
	 * 
	 * @param event
	 * @autor
	 */
	public void eliminarCab(ActionEvent event) {
		if (getCabRsv() != null) {
			try {
				adminCrud.eliminar(this.cabRsv);
			} catch (Exception e) {
			}
		} else {
		}
	}

	/**
	 * Permite actualizar un objeto cliente
	 * 
	 * @autor
	 */
	public void editarCab() {
		if (getCabRsv() != null) {
			super.addSuccessMessage("Cliente cargado "
					+ this.cabRsv.getDescrEvento());
			PrimeFaceUtil.saltarTabAcordeon("form:acoPanTec", 0);
		} else {

			super.addSuccessMessage(super.getRecursoGeneral().getString(
					"msgEditar")
					+ " " + this.cabRsv.getDescrEvento());
		}
	}

	private void cargarCabecera() {
		listaCabRsv = new ArrayList<Cabreservacion>();
		List<Object> cabTmp = adminCrud.consultarTodo(new Instalacion());
		for (Object cabeTmp : cabTmp) {
			listaCabRsv.add((Cabreservacion) cabeTmp);
		}
	}

	private void cargarDetalle() {
		listaDetRsv = new ArrayList<Detreservacion>();
		List<Object> detTmp = adminCrud.consultarTodo(new Instalacion());
		for (Object detaTmp : detTmp) {
			listaCabRsv.add((Cabreservacion) detaTmp);
		}
	}

	/**
	 * Selecciona un objeto Institucion de un dataTable
	 * 
	 * @param event
	 * @autor
	 */
	public void onRowSelect(SelectEvent event) {
		setCabRsv((Cabreservacion) event.getObject());
	}

	public void handleSelect(SelectEvent event) {
		FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO,
				"Selected:" + event.getObject().toString(), null);
		FacesContext.getCurrentInstance().addMessage(null, message);
	}

	public List<Institucion> completeInst(String query) {
		List<Institucion> suggestions = new ArrayList<Institucion>();

		for (Institucion p : listaInstitucion) {
			if (p.getNombre().startsWith(query))
				suggestions.add(p);
		}

		return suggestions;
	}

	// public void cargarInstitucion() {
	// // listaInstitucion = new ArrayList<Institucion>();
	// // List<Object> institutoTmp = adminCrud.consultarTodo(new
	// Institucion());
	// // for (Object instTmp : institutoTmp) {
	// // listaInstitucion.add((Institucion) instTmp);
	// // }
	// }

	public void cargarInstitucion() {
		//Institucion inst = (Institucion) adminCrud.buscar(new Institucion(),Integer.parseInt(this.idInst));
		List<Object> cli = adminCrud
				.consultaGeneral("select cli from Cliente as cli where cli.institucion.idInstitucion ='"
						+ getIdInst() + "'");
		this.listaCliente.clear();
		for (Object cliTmp : cli) {
			this.listaCliente.add((Cliente) cliTmp);
		}
	}

	public void cargarCliente() {
		Cliente cli = (Cliente) adminCrud.buscar(new Cliente(),
				Integer.parseInt(this.idCli));
		this.cabRsv.setCliente(cli);

	}

	public Cabreservacion getCabRsv() {
		return cabRsv;
	}

	public void setCabRsv(Cabreservacion cabRsv) {
		this.cabRsv = cabRsv;
	}

	public List<Cabreservacion> getListaCabRsv() {
		cargarCabecera();
		return listaCabRsv;
	}

	public void setListaCabRsv(List<Cabreservacion> listaCabRsv) {
		this.listaCabRsv = listaCabRsv;
	}

	public Auditoria getAuditoriaCab() {
		return auditoriaCab;
	}

	public void setAuditoriaCab(Auditoria auditoriaCab) {
		this.auditoriaCab = auditoriaCab;
	}

	public Detreservacion getDetRsv() {
		return detRsv;
	}

	public void setDetRsv(Detreservacion detRsv) {
		this.detRsv = detRsv;
	}

	public List<Detreservacion> getListaDetRsv() {
		cargarDetalle();
		return listaDetRsv;
	}

	public void setListaDetRsv(List<Detreservacion> listaDetRsv) {
		this.listaDetRsv = listaDetRsv;
	}

	public Auditoria getAuditoriaDet() {
		return auditoriaDet;
	}

	public void setAuditoriaDet(Auditoria auditoriaDet) {
		this.auditoriaDet = auditoriaDet;
	}

	public void setInstitucion(Institucion institucion) {
		this.institucion = institucion;
	}

	public Institucion getInstitucion() {
		return institucion;
	}

	public List<Institucion> getListaInstitucion() {
		return listaInstitucion;
	}

	public void setListaInstitucion(List<Institucion> listaInstitucion) {
		this.listaInstitucion = listaInstitucion;
	}

	public void setIdInst(String idInst) {
		this.idInst = idInst;
	}

	public String getIdInst() {
		return idInst;
	}

	public void setIdCli(String idCli) {
		this.idCli = idCli;
	}

	public String getIdCli() {
		return idCli;
	}

	public List<Cliente> getListaCliente() {
		return listaCliente;
	}

	public void setListaCliente(List<Cliente> listaCliente) {
		this.listaCliente = listaCliente;
	}

	

}
